#include<bits/stdc++.h> 
using namespace std;
//	一份地图给出了城市之间沿高速公路的距离，以及各个高速公路的收费。现在需要写一个程序来
//	帮助旅行者找到起点与终点间的最短路径，如果最短路径不唯一，输出最小花费。
//1.每个输入包括一个测试用例，每个测试用例由两部分组成，第一部分是一行N，M，S，D。N≤500
//	是城市的个数，城市编号0~N-1，M是高速公路的条数。S和D分别是起点和终点的编号。
//2.第二部分是M行，每一行包括一条路的信息，格式为 城市1 城市2 距离 花费
//3.高速公路信息的所有的数字都不超过500 
//4.对于每一个输入，一行内输出最短路从起点到终点的所有点，然后输出总花费。
//5.最短路径，DFS，Dijkstra
//这题思路、考点跟1018如出一辙，都是先用Dijkstra求出最短路径，再用DFS从终点往起点走，找
//到消费最少的路，所以思路不多做赘述 
int roads[500][500];
int costs[500][500];
int dist[500];
bool visited[500];
int N, M, S, D;
int inf = INT_MAX;
vector<int> pre[500];
vector<int> road;
vector<int> bestroad;
int min_cost = inf;
void Dijkstra(){
	dist[S] = 0;
	while(true){
		int min_index = -1;
		int min_dis = inf;
		for(int i=0;i<N;i++){
			if(visited[i] == false && dist[i]<min_dis){
				min_index = i;
				min_dis = dist[i];
			}
		}
		if(min_index == -1) return;
		visited[min_index] = true;
		for(int i=0;i<N;i++){
			if(visited[i]==false && roads[i][min_index]!=inf){
				if(dist[min_index]+roads[min_index][i]<dist[i]){
					dist[i] = dist[min_index]+roads[min_index][i];
					pre[i].clear();
					pre[i].push_back(min_index);
				}
				else if(dist[min_index]+roads[min_index][i]==dist[i]){
					pre[i].push_back(min_index);
				}
			}
		}
	}
}
void DFS(int now){
	if(now==S){
		road.push_back(now);
		int cost = 0;
		for(int i = 0;i<road.size()-1;i++){
			cost += costs[road[i]][road[i+1]];
		}
		if(cost < min_cost){
			min_cost = cost;
			bestroad = road;
		}
		road.pop_back();
		return;
	}
	road.push_back(now);
	for(int i=0;i<pre[now].size();i++) DFS(pre[now][i]);
	road.pop_back();
	return;
}
int main(){
	fill(roads[0],roads[0]+500*500,inf);
	fill(dist,dist+500,inf);
	fill(visited,visited+500,false);
	cin>>N>>M>>S>>D;
	for(int i=0;i<M;i++){
		int s, d;
		cin>>s>>d;
		cin>>roads[s][d];
		cin>>costs[s][d];
		roads[d][s] = roads[s][d];
		costs[d][s] = costs[s][d];
	}
	Dijkstra();
	DFS(D);
	for(int i =bestroad.size()-1;i>=0;i--){
		cout<<bestroad[i]<<" ";
	}
	cout<<dist[D]<<" "<<min_cost<<endl;
} 
 